#include <iostream>
#include <sstream>
#include <vector>
#include <string>
#include <memory>
#include </usr/include/jsoncpp/json/json.h>

// 使用jsoncpp库进行多个数据对象的序列化

std::string serialize(Json::Value root)
{
    // 2.实例化一个StreamwriterBuilder工厂类对象
    Json::StreamWriterBuilder swb;
    // 3.通过StreamwriterBuilder工厂类对象生产一个StreamWriter对象
    std::shared_ptr<Json::StreamWriter> sw(swb.newStreamWriter());
    // 4.使用StreamWriter对象，对Json::Value中存储的数据进行序列化
    std::stringstream ss;
    int ret = sw->write(root, &ss);
    if (ret != 0)
    {
        std::cout << "json serialize failed!!\n";
        return {};
    }
    return ss.str();
    // std::cout << ss.str() << std::endl;
}

Json::Value unserialize(const std::string &str)
{
    // 1.实例化一个CharReaderBuilder工厂类对象
    Json::CharReaderBuilder crb;

    // 2.使用CharReaderBuilder工厂类生产一个CharReader对象
    std::shared_ptr<Json::CharReader> cr(crb.newCharReader());
    // 3.定义一个Json::Value对象存储解析后的数据
    Json::Value root;
    std::string err;
    // 4.使用CharReader对象进行json格式字符串str的反序列化
    bool ret = cr->parse(str.c_str(), str.c_str() + str.size(), &root, &err);
    if (!ret)
    {
        std::cout << "json unserialize failed: " << err << std::endl;
        return {};
    }
    // 5.逐个元素去访问Json::value中的数据
    return root;
}

int main()
{
    // 1.将需要进行序列化的数据，存储在Json::value 对象中
    Json::Value root;
    root["姓名"] = "小明";
    root["年龄"] = 18;
    root["成绩"].append(98);
    root["成绩"].append(88.5);
    root["成绩"].append(78.5);
    std::string str = serialize(root);
    std::cout << str << std::endl;

    Json::Value root1 = unserialize(str);
    std::cout << "姓名" << root1["姓名"].asString() << std::endl;
    std::cout << "年龄" << root1["年龄"].asInt() << std::endl;
    int sz = root1["成绩"].size();
    for (int i = 0; i < sz; i++)
    {
        std::cout << "成绩 " << root1["成绩"][i].asFloat() << std::endl;
    }
    return 0;
}